মেটাপ্রোগ্রামিং হল এমন একটি প্রোগ্রামিং কৌশল যেখানে প্রোগ্রাম নিজেই তার কোড পরিবর্তন বা প্রক্রিয়া করতে সক্ষম হয়। Groovy তে মেটাপ্রোগ্রামিং খুবই শক্তিশালী এবং নমনীয়, কারণ এটি কোড জেনারেশন, ডাইনামিক মেথড কলিং, ডাইনামিক প্রপার্টি অ্যাক্সেস, এবং অটোমেটিক ডেক্লেয়ারেশন এর মতো বৈশিষ্ট্যগুলির মাধ্যমে কোডকে আরও অ্যাডাপ্টেবল এবং শক্তিশালী করে তোলে।
Groovy তে মেটাপ্রোগ্রামিং এর মাধ্যমে আপনি কোডের আচরণ রানটাইমে পরিবর্তন করতে পারবেন এবং ডাইনামিকভাবে কোড পরিচালনা করতে পারবেন। Groovy মেটাপ্রোগ্রামিংয়ের মাধ্যমে আপনি আরও জেনেরিক, ফ্লেক্সিবল এবং স্কেলেবল কোড লিখতে পারবেন।
Groovy তে ডাইনামিক মেথড কলিং খুবই সহজ। আপনি এমন মেথড কল করতে পারেন যেগুলি রানটাইমে তৈরি হয়, এবং যদি সেই মেথডটি ক্লাসে উপস্থিত না থাকে, Groovy তাতে স্বয়ংক্রিয়ভাবে কিছু ডিফল্ট আচরণ প্রয়োগ করবে।
class DynamicMethodExample {
def invokeMethod(String name, args) {
return "Called method: $name with arguments: $args"
}
}
def obj = new DynamicMethodExample()
println obj.someMethod("param1", "param2") // Output: Called method: someMethod with arguments: [param1, param2]
এখানে, invokeMethod
একটি বিশেষ মেথড যা ডাইনামিকভাবে কল হওয়া যেকোনো মেথডের জন্য ট্রিগার হয়। যদি someMethod
ক্লাসে উপস্থিত না থাকে, তাহলে invokeMethod
কল হবে এবং এটি আর্গুমেন্ট গ্রহণ করবে।
Groovy তে আপনি যেকোনো প্রপার্টি (ফিল্ড) ডাইনামিকভাবে অ্যাক্সেস করতে পারেন। এটি আপনাকে কোড আরও নমনীয় এবং সাধারণভাবে কাজ করার সুযোগ দেয়।
class DynamicPropertyExample {
def propertyMissing(String name) {
return "Property $name does not exist!"
}
}
def obj = new DynamicPropertyExample()
println obj.someProperty // Output: Property someProperty does not exist!
এখানে, propertyMissing
একটি স্পেশাল মেথড যা যখন কোনও উপস্থিত প্রপার্টি অ্যাক্সেস করা হয়, কিন্তু সেটি ক্লাসে নেই, তখন কল হয়।
Groovy তে আপনি ডাইনামিক ক্লাস তৈরি করতে পারেন, যেখানে ক্লাস রানটাইমে পরিবর্তিত হতে পারে। Groovy এর Expando
এবং MetaClass
API ব্যবহার করে এটি করা যায়।
Expando
ক্লাস আপনাকে রানটাইমে প্রপার্টি এবং মেথড অ্যাড করতে সহায়তা করে।
def person = new Expando()
person.name = "John"
person.greet = { "Hello, $name!" }
println person.name // Output: John
println person.greet() // Output: Hello, John!
এখানে, Expando
ব্যবহার করে name
প্রপার্টি এবং greet()
মেথড ডাইনামিকভাবে যোগ করা হয়েছে।
Groovy এর MetaClass
API এর মাধ্যমে ক্লাসের আচরণ পরিবর্তন করা যায়।
String.metaClass.toUpperCase = { "Customized: ${delegate.toUpperCase()}" }
println "hello".toUpperCase() // Output: Customized: HELLO
এখানে, Groovy এর MetaClass
API এর মাধ্যমে String
ক্লাসের toUpperCase()
মেথডকে কাস্টমাইজ করা হয়েছে।
Groovy তে আপনি মেথড, প্রপার্টি এবং অন্যান্য আচরণগুলির জন্য হুক ব্যবহার করতে পারেন। এগুলি কোডের প্রবাহকে ইন্টারসেপ্ট বা পরিবর্তন করতে সহায়তা করে।
class Example {
def methodMissing(String name, args) {
println "Method $name is missing. Arguments: $args"
}
}
def obj = new Example()
obj.nonExistentMethod("Hello") // Output: Method nonExistentMethod is missing. Arguments: [Hello]
এখানে, methodMissing
হুক ব্যবহার করে Groovy এমন মেথড কল গুলো ধরতে সক্ষম যা ক্লাসে উপস্থিত নেই।
Groovy তে, আপনি রানটাইমে ক্লাসের আচরণ পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, আপনি একটি ক্লাসে নতুন মেথড যোগ করতে পারেন বা পুরানো মেথড পরিবর্তন করতে পারেন।
Integer.metaClass.isEven = { delegate % 2 == 0 }
println 4.isEven() // Output: true
println 5.isEven() // Output: false
এখানে, isEven()
মেথড রানটাইমে Integer
ক্লাসে যোগ করা হয়েছে এবং এটি একটি নতুন আচরণ দিয়েছে।
Groovy এর মেটা-ক্লাস সিস্টেম আপনাকে ক্লাসের আচরণ রানটাইমে পরিবর্তন করার সুবিধা দেয়। আপনি নতুন মেথড যোগ করতে পারেন বা বিদ্যমান মেথডগুলিকে পরিবর্তন করতে পারেন, এমনকি প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন করতেও এটি সহায়তা করে।
class Person {
String name
}
def person = new Person(name: "Alice")
person.metaClass.getName = { "Hello, $delegate.name!" }
println person.name // Output: Hello, Alice!
এখানে, Person
ক্লাসের getName()
মেথডকে রানটাইমে পরিবর্তন করা হয়েছে।
Groovy তে মেটাপ্রোগ্রামিং এর মাধ্যমে আপনি কোডের আচরণ রানটাইমে পরিবর্তন করতে পারেন। ডাইনামিক মেথড কলিং, ডাইনামিক প্রপার্টি অ্যাক্সেস, ট্রেট, Mixin, এবং MetaClass API এর মাধ্যমে Groovy তে মেটাপ্রোগ্রামিং সহজ এবং কার্যকরী। Groovy এর মেটাপ্রোগ্রামিংয়ের শক্তিশালী বৈশিষ্ট্যগুলি আপনাকে আরও ফ্লেক্সিবল এবং শক্তিশালী কোড তৈরি করতে সাহায্য করবে।
Groovy তে MetaClass এবং Runtime Modifications হলো এমন কিছু বৈশিষ্ট্য যা Class এবং Object এর আচরণ পরিবর্তন করার ক্ষমতা প্রদান করে, বিশেষত Runtime এ। MetaClass এর মাধ্যমে Groovy তে ডায়নামিক মেথড, প্রপার্টি সংযোজন এবং Class এর আচরণ পরিবর্তন করা যায়। এই ক্ষমতা প্রোগ্রামিংকে আরও নমনীয় এবং ডায়নামিক করে তোলে এবং এটি বিশেষত গ্রোভির মেটাপ্রোগ্রামিং বৈশিষ্ট্যের অন্তর্গত।
MetaClass হলো Groovy তে একটি বিশেষ ধরনের ক্লাস যা প্রতিটি Groovy ক্লাসের সাথে যুক্ত থাকে এবং এটি ক্লাসের প্রপার্টি ও মেথডগুলোর বিবরণ ধারণ করে। MetaClass ব্যবহার করে আমরা রানটাইমে কোনো ক্লাস বা অবজেক্টের আচরণ পরিবর্তন করতে পারি, যেমন নতুন মেথড যোগ করা, বিদ্যমান মেথড ওভাররাইড করা ইত্যাদি।
MetaClass ব্যবহার করে Runtime এ কোনো Class এ নতুন মেথড যোগ করা যায়।
class Person {
String name
}
// Runtime এ নতুন মেথড যোগ করা
Person.metaClass.sayHello = { -> "Hello, my name is $name" }
def person = new Person(name: "Alice")
println person.sayHello() // Output: Hello, my name is Alice
এখানে Person
ক্লাসে sayHello
নামে একটি নতুন মেথড যোগ করা হয়েছে MetaClass এর মাধ্যমে, যা রানটাইমে ব্যবহার করা সম্ভব।
MetaClass ব্যবহার করে রানটাইমে বিদ্যমান মেথড ওভাররাইড করা সম্ভব।
class Calculator {
def add(int a, int b) {
return a + b
}
}
// Runtime এ add() মেথড ওভাররাইড করা
Calculator.metaClass.add = { int a, int b -> a * b }
def calculator = new Calculator()
println calculator.add(5, 3) // Output: 15
এখানে Calculator
ক্লাসের add()
মেথডকে Runtime এ ওভাররাইড করে নতুন মেথড হিসাবে ব্যবহার করা হয়েছে, যা এখন যোগের পরিবর্তে গুণ করছে।
MetaClass ব্যবহার করে একটি Object এ নতুন Property যোগ করা যায় বা বিদ্যমান Property পরিবর্তন করা যায়।
class Person {
String name
}
// Runtime এ age নামে একটি নতুন Property যোগ করা
Person.metaClass.age = 25
def person = new Person(name: "Bob")
println "${person.name} is ${person.age} years old" // Output: Bob is 25 years old
এখানে Person
ক্লাসে age
নামে নতুন একটি Property যোগ করা হয়েছে MetaClass এর মাধ্যমে, যা রানটাইমে ব্যবহার করা সম্ভব।
Groovy তে methodMissing
এবং propertyMissing
নামের মেথড দুটি ব্যবহৃত হয় অজানা মেথড বা প্রপার্টি কল করার জন্য। এগুলোর মাধ্যমে ডায়নামিক মেথড এবং প্রপার্টি তৈরি করা যায়।
class DynamicPerson {
def methodMissing(String name, args) {
return "Called method $name with arguments $args"
}
}
def person = new DynamicPerson()
println person.sayHello("Alice") // Output: Called method sayHello with arguments [Alice]
এখানে sayHello
মেথড DynamicPerson
ক্লাসে সংজ্ঞায়িত না থাকলেও, methodMissing
মেথড ব্যবহার করে এটি ডায়নামিকভাবে একটি মেসেজ রিটার্ন করছে।
Groovy তে ExpandoMetaClass
ব্যবহার করে আরও সহজে এবং সরাসরি ক্লাস মডিফিকেশন করা যায়। এটি MetaClass এর মতোই কাজ করে তবে বেশি নমনীয় এবং দ্রুত।
class Person {
String name
}
// ExpandoMetaClass ব্যবহার করে মেথড যোগ করা
Person.metaClass.sayGoodbye = { -> "Goodbye, $name" }
def person = new Person(name: "Alice")
println person.sayGoodbye() // Output: Goodbye, Alice
ExpandoMetaClass
ব্যবহারে MetaClass এর মতোই নতুন মেথড বা প্রপার্টি যোগ করা যায়।
Groovy তে Category Class ব্যবহার করে একটি নির্দিষ্ট Block এর জন্য রানটাইমে মেথড বা প্রপার্টি যোগ করা যায়। এটি Temporary Runtime Modifications করার জন্য ব্যবহার করা হয়।
class StringCategory {
static String shout(String str) {
return str.toUpperCase()
}
}
use(StringCategory) {
println "hello".shout() // Output: HELLO
}
এখানে StringCategory
নামের একটি ক্যাটাগরি ক্লাস ব্যবহার করে String
ক্লাসে shout
নামে একটি মেথড যোগ করা হয়েছে, যা শুধুমাত্র use
ব্লকের মধ্যে কার্যকর থাকবে।
MetaClass এবং Runtime Modifications এর মাধ্যমে Groovy তে ডায়নামিক এবং নমনীয় প্রোগ্রামিং করা সহজ হয়, যা প্রোগ্রামারদের দ্রুত এবং ডায়নামিক কোড তৈরি করতে সাহায্য করে।
Groovy Development Kit (GDK) হল Groovy ভাষার একটি সমৃদ্ধ লাইব্রেরি সেট যা Groovy প্রোগ্রামিং ভাষার উপর ভিত্তি করে তৈরি হয় এবং Groovy তে ডেভেলপমেন্ট প্রক্রিয়াকে আরও সহজ এবং শক্তিশালী করে। GDK Groovy এর জন্য একটি সমৃদ্ধ API প্রদান করে যা Java Development Kit (JDK) এর সাথে কাজ করে এবং Groovy প্রোগ্রাম লেখার সময় অতিরিক্ত ফিচার ও সুবিধা যুক্ত করে।
GDK মূলত Groovy তে আরও সহজ ও দ্রুত ডেভেলপমেন্টের জন্য ডিজাইন করা হয়েছে এবং Groovy ভাষার সিলেক্টিভ ফিচারগুলির সাথে Java লাইব্রেরি এবং ক্লাসের মধ্যে ইন্টিগ্রেশন সহজ করে। GDK Groovy এর অধিকাংশ প্রাথমিক ফাংশনালিটি প্রদান করে, যেমন I/O অপারেশন, ডেটা স্ট্রাকচার, কলেকশন ম্যানিপুলেশন, এবং অন্যান্য লাইব্রেরি ফাংশন।
Collection API:
GDK Groovy এর জন্য শক্তিশালী এবং সহজ ইউটিলিটি প্রদান করে যা Groovy এর কলেকশন (List, Set, Map, ইত্যাদি) ম্যানিপুলেশন করে। Groovy তে কলেকশন অপারেশনগুলো যেমন filtering, mapping, sorting এগুলি Groovy GDK এর মাধ্যমে খুব সহজে করা যায়।
উদাহরণ:
def list = [1, 2, 3, 4, 5]
def squaredList = list.collect { it * it }
println squaredList // আউটপুট: [1, 4, 9, 16, 25]
String Handling:
Groovy GDK স্ট্রিং অপারেশনগুলো সহজ এবং দ্রুততর করার জন্য কিছু অতিরিক্ত ফিচার প্রদান করে। Groovy তে স্ট্রিং ইন্টারপোলেশন এবং স্ট্রিং ম্যানিপুলেশন প্রক্রিয়াগুলো খুবই সহজ।
উদাহরণ:
def name = "Groovy"
println "Hello, $name!" // আউটপুট: Hello, Groovy!
I/O এবং File Handling:
GDK Groovy তে ফাইল I/O অপারেশন করার জন্য সহজ পদ্ধতি প্রদান করে। Groovy এর GDK এর মাধ্যমে ফাইল পড়া এবং লেখা অনেক সহজ হয়।
উদাহরণ:
def file = new File("example.txt")
file.text = "Hello, Groovy!" // ফাইলে লেখার উদাহরণ
println file.text // ফাইলের কন্টেন্ট পড়ার উদাহরণ
Closures এবং Functional Programming:
GDK Groovy তে ক্লোজার (closures) সমর্থন করে, যা Groovy কে ফাংশনাল প্রোগ্রামিংয়ের জন্য আরও শক্তিশালী করে। GDK এর মাধ্যমে আপনি একাধিক ক্লোজার এবং ফাংশনাল স্টাইল কোড লেখার সুবিধা পেতে পারেন।
উদাহরণ:
def list = [1, 2, 3, 4, 5]
def evenNumbers = list.findAll { it % 2 == 0 }
println evenNumbers // আউটপুট: [2, 4]
Markup Builders:
GDK তে Markup Builders এর সুবিধা রয়েছে, যা XML এবং HTML তৈরি করতে সাহায্য করে। Groovy তে Markup Builder ব্যবহার করে আপনি XML বা HTML কন্টেন্ট তৈরি করতে পারেন সহজে।
উদাহরণ:
def builder = new groovy.xml.MarkupBuilder()
builder.html {
head {
title("Groovy Example")
}
body {
h1("Hello, Groovy!")
}
}
Regular Expressions:
Groovy তে GDK এর মাধ্যমে সহজে Regular Expressions ব্যবহার করা যায়। Groovy তে String-এ প্যাটার্ন ম্যাচিং এবং রেগুলার এক্সপ্রেশন সহজে কার্যকর করা যায়।
উদাহরণ:
def str = "Groovy is awesome!"
def matcher = str =~ /awesome/
println matcher // আউটপুট: true
// GDK এর মাধ্যমে ফাইল I/O উদাহরণ
def file = new File('groovy_example.txt')
file.text = "This is an example of Groovy GDK!" // ফাইলে লেখা
println file.text // আউটপুট: This is an example of Groovy GDK!
এখানে, GDK এর File
ক্লাস ব্যবহার করে একটি ফাইল তৈরি করা হয়েছে এবং এতে টেক্সট লেখা হয়েছে।
Groovy Development Kit (GDK) হল Groovy প্রোগ্রামিং ভাষার জন্য একটি শক্তিশালী লাইব্রেরি যা Groovy কোডের ডেভেলপমেন্ট প্রক্রিয়াকে আরও সহজ, দ্রুত এবং কার্যকরী করে তোলে। GDK Groovy এর জন্য প্রিপ্রসেসিং, ফাইল I/O, স্ট্রিং ম্যানিপুলেশন, কলেকশন ম্যানিপুলেশন এবং অন্যান্য ফিচারের সুবিধা প্রদান করে। Groovy এবং Java এর মধ্যে পারস্পরিক কাজের মাধ্যমে GDK একটি শক্তিশালী টুল হিসেবে কাজ করে, যা Groovy প্রোগ্রামিংয়ের জন্য আরও সহজ এবং কার্যকর কোড লেখার সুযোগ দেয়।
Groovy একটি ডাইনামিক প্রোগ্রামিং ভাষা যা অনেকগুলো শক্তিশালী বৈশিষ্ট্য সরবরাহ করে, যার মধ্যে Dynamic Method Addition এবং Property Handling অন্যতম। Groovy তে আপনি runtime এর সময় নতুন মেথড এবং প্রপার্টি যুক্ত করতে পারেন, যা Java তে সম্ভব নয়। এই বৈশিষ্ট্যটি Groovy কে আরও নমনীয় এবং শক্তিশালী করে তোলে।
Groovy তে আপনি runtime এ অবজেক্টে নতুন মেথড যুক্ত করতে পারেন, যা Java তে সম্ভব নয়। Groovy এর MetaClass বৈশিষ্ট্যের মাধ্যমে এটি করা যায়। এটি এমন একটি টেকনিক যা আপনাকে ক্লাসের behaviour পরিবর্তন করার সুযোগ দেয় এবং নতুন মেথড তৈরি করতে সহায়তা করে।
class Person {
String name
int age
}
def person = new Person(name: "John", age: 30)
// Dynamic method addition using MetaClass
Person.metaClass.sayHello = { -> "Hello, my name is ${delegate.name}" }
println person.sayHello() // Output: Hello, my name is John
এখানে:
Person
ক্লাসের জন্য sayHello
নামক একটি নতুন মেথড runtime এ যোগ করেছি।metaClass
এর মাধ্যমে Groovy নতুন মেথডটি Person
ক্লাসের সাথে যুক্ত করেছে।মেটা-ক্লাস (MetaClass) Groovy এর একটি শক্তিশালী ফিচার যা অবজেক্টের behaviour পরিবর্তন করতে সক্ষম। এটি Groovy তে একটি ক্লাসের নতুন মেথড যুক্ত করার জন্য ব্যবহৃত হয়, যা runtime এ করা হয়।
Groovy তে ডাইনামিক প্রপার্টি হ্যান্ডলিং অনেক সহজ। Groovy তে আপনি runtime এ একটি অবজেক্টের প্রপার্টি (field) তৈরি এবং পরিচালনা করতে পারেন, এবং নতুন প্রপার্টি যুক্ত করতে পারেন।
Groovy এর Property Handling এর মাধ্যমে আপনি ডাইনামিকভাবে getter এবং setter মেথড তৈরি করতে পারেন। আপনি যদি একটি প্রপার্টি অ্যাক্সেস করার চেষ্টা করেন যা ক্লাসে ডিফাইন করা নেই, Groovy এটি runtime এ তৈরি করে দেয়।
class Person {
String name
int age
}
def person = new Person(name: "John", age: 30)
// Accessing dynamic property that is not defined in the class
person.city = "New York" // Adding a dynamic property
println person.city // Output: New York
এখানে:
city
নামক একটি নতুন প্রপার্টি Person
ক্লাসের instance এর মাধ্যমে ডাইনামিকভাবে তৈরি করা হয়েছে।city
প্রপার্টি অ্যাক্সেস করা সম্ভব হয়েছে, এবং এটি runtime এ person
অবজেক্টে যুক্ত হয়ে গেছে।Groovy তে আপনি ডাইনামিকভাবে getter এবং setter মেথডও তৈরি করতে পারেন।
class Person {
String name
int age
}
def person = new Person(name: "Alice", age: 25)
// Dynamic setter and getter for a property
person.metaClass.getCity = { -> "New York" }
person.metaClass.setCity = { city -> println "City set to: $city" }
println person.city // Output: New York
person.city = "Los Angeles" // Output: City set to: Los Angeles
এখানে:
city
নামক একটি প্রপার্টি metaClass
ব্যবহার করে ডাইনামিকভাবে getter এবং setter মেথডের মাধ্যমে অ্যাক্সেস করা হয়েছে।person.city
অ্যাক্সেস করেন, তখন এটি New York
রিটার্ন করবে।person.city = "Los Angeles"
কল করলে, setter মেথড কার্যকর হবে এবং "City set to: Los Angeles"
প্রিন্ট করবে।Groovy তে Dynamic Method Addition এবং Property Handling শক্তিশালী বৈশিষ্ট্য যা কোড লেখার সময় নমনীয়তা এবং কার্যকারিতা বাড়ায়। Groovy তে metaClass
ব্যবহার করে আপনি runtime এ নতুন মেথড এবং প্রপার্টি যুক্ত করতে পারেন, যা Java তে সম্ভব নয়। এই বৈশিষ্ট্যগুলি Groovy কে একটি অত্যন্ত নমনীয় এবং শক্তিশালী প্রোগ্রামিং ভাষা করে তোলে।
Groovy একটি ডাইনামিক প্রোগ্রামিং ভাষা যা Meta-Programming এর শক্তিশালী সমর্থন প্রদান করে। Meta-Programming এমন একটি প্রক্রিয়া যা কোডের গঠন এবং আচরণকে রানটাইম বা কম্পাইল-টাইমে পরিবর্তন করতে সহায়তা করে। Groovy তে, মেটা-প্রোগ্রামিং দুটি প্রধান ধাপে ভাগ করা যায়: Compile-Time Meta-Programming এবং Runtime Meta-Programming। এই দুটি পদ্ধতি কোডের আচরণ পরিবর্তন করতে সহায়তা করে, তবে তারা বিভিন্ন সময়ে এবং বিভিন্ন উপায়ে কাজ করে।
এখানে Compile-Time এবং Runtime Meta-Programming এর সম্পর্কে বিস্তারিত আলোচনা করা হলো।
Compile-Time Meta-Programming হল একটি পদ্ধতি যা কম্পাইলেশনের সময় কোডের মেটা-ডেটা পরিবর্তন বা প্রসেস করে। Groovy তে AST Transformations (Abstract Syntax Tree Transformations) ব্যবহার করে Compile-Time মেটা-প্রোগ্রামিং করা হয়। এই প্রক্রিয়ায়, কোডের গঠন (syntax) বা তার আচরণ কম্পাইলেশন টাইমে পরিবর্তন করা হয়, এবং এটি কোডের কার্যকারিতা সরাসরি প্রভাবিত করতে পারে।
Groovy তে AST Transformations ব্যবহার করে আপনি ক্লাসের মেথড বা প্রপার্টির আচরণ পরিবর্তন করতে পারেন, যেমন @TupleConstructor, @Canonical, @Immutable, ইত্যাদি। এগুলি কম্পাইল-টাইমে কোডকে পরিবর্তন করে।
@TupleConstructor
একটি Groovy AST transformation যা ক্লাসের জন্য একটি কন্সট্রাক্টর তৈরি করে, যা সব প্রপার্টি প্যারামিটার হিসেবে নেবে।
@TupleConstructor
class Person {
String name
int age
}
def person = new Person("John", 30)
println person.name // Output: John
println person.age // Output: 30
এখানে, @TupleConstructor
দিয়ে Groovy ক্লাসের জন্য একটি কন্সট্রাক্টর তৈরি করেছে, যা name
এবং age
কে ইনিশিয়ালাইজ করে।
@Canonical
একটি Groovy AST transformation যা ক্লাসের জন্য toString()
, equals()
এবং hashCode()
মেথডগুলি তৈরি করে।
@Canonical
class Person {
String name
int age
}
def person1 = new Person("Alice", 25)
def person2 = new Person("Alice", 25)
println person1 // Output: Person(Alice, 25)
println person1 == person2 // Output: true
এখানে, @Canonical
মেটা-প্রোগ্রামিং ট্যাগ ক্লাসের জন্য toString()
, equals()
, এবং hashCode()
মেথড তৈরি করেছে।
Groovy তে Compile-Time Mixin ব্যবহার করে আপনি ক্লাসে নতুন বৈশিষ্ট্য বা আচরণ যোগ করতে পারেন। এটি সাধারণত কোডের আগে কার্যকর হয়।
class Person {
String name
int age
}
@Mixin(Person)
class SpecialPerson {
String nickname
}
def person = new SpecialPerson(name: "John", age: 30, nickname: "Johnny")
println person.nickname // Output: Johnny
এখানে, @Mixin
কম্পাইল-টাইমে SpecialPerson
ক্লাসে Person
ক্লাসের বৈশিষ্ট্য যোগ করেছে।
Runtime Meta-Programming হল এমন একটি প্রক্রিয়া যেখানে কোডের গঠন বা আচরণ রানটাইমে পরিবর্তিত হয়। Groovy তে আপনি MetaClass, ExpandoMetaClass এবং Method Missing এর মতো বিভিন্ন মেকানিজম ব্যবহার করে রানটাইম মেটা-প্রোগ্রামিং করতে পারেন। রানটাইম মেটা-প্রোগ্রামিং এর মাধ্যমে, আপনি অবজেক্টের মেথড, প্রপার্টি বা আচরণ পরিবর্তন করতে পারেন, এমনকি এটি তৈরি হওয়ার পরেও।
Groovy তে MetaClass ব্যবহার করে আপনি একটি ক্লাসের মেথড বা প্রপার্টি রানটাইমে পরিবর্তন করতে পারেন। Groovy এর ExpandoMetaClass এর মাধ্যমে, আপনি ডাইনামিকভাবে মেথড যোগ করতে পারেন।
class Person {
String name
int age
}
def person = new Person(name: "Alice", age: 25)
println person.name // Output: Alice
// Modify the name property using MetaClass
person.metaClass.getName = { -> "Modified: ${delegate.name}" }
println person.name // Output: Modified: Alice
এখানে, metaClass
ব্যবহার করে Person
ক্লাসের name
প্রপার্টি রানটাইমে পরিবর্তন করা হয়েছে।
class Person {
String name
int age
}
def person = new Person(name: "Bob", age: 28)
// Dynamically add a new method at runtime
person.metaClass.sayHello = { -> println "Hello, I am ${delegate.name}!" }
person.sayHello() // Output: Hello, I am Bob!
এখানে, ExpandoMetaClass
ব্যবহার করে sayHello
মেথড রানটাইমে Person
ক্লাসে যোগ করা হয়েছে।
Groovy তে Method Missing একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একটি মেথডের জন্য ডাইনামিকভাবে কোড লিখতে সক্ষম করে, যখন সেই মেথড কোনও ক্লাসে ডিফাইন করা না থাকে।
class DynamicPerson {
def methodMissing(String name, args) {
println "Method $name is called with arguments $args"
}
}
def person = new DynamicPerson()
person.someMethod("Hello", "World") // Output: Method someMethod is called with arguments [Hello, World]
এখানে, methodMissing
ব্যবহার করা হয়েছে ডাইনামিকভাবে মেথড কল হ্যান্ডল করার জন্য, যেখানে someMethod
ডিফাইন করা হয়নি।
বৈশিষ্ট্য | Compile-Time Meta-Programming | Runtime Meta-Programming |
---|---|---|
কাজের সময় | কম্পাইলেশনের সময় | রানটাইমে |
কোড পরিবর্তন | কোডের গঠন কম্পাইলেশনের সময় পরিবর্তন হয় | কোডের আচরণ রানটাইমে পরিবর্তিত হয় |
বৈশিষ্ট্য/অভ্যাস | AST Transformations, Compile-Time Mixin | MetaClass, ExpandoMetaClass, Method Missing |
উদাহরণ | @TupleConstructor , @Canonical , @Immutable | metaClass , ExpandoMetaClass , methodMissing |
প্রয়োগ | ক্লাসের কোড পরিবর্তন করা | অবজেক্টের আচরণ বা ফাংশনালিটি রানটাইমে পরিবর্তন করা |
Groovy তে Meta-Programming একটি শক্তিশালী ফিচার যা কোডের গঠন এবং আচরণকে পরিবর্তন করতে সহায়তা করে। Compile-Time Meta-Programming কোডের গঠন কম্পাইলেশনের সময় পরিবর্তন করে (যেমন AST Transformations), এবং Runtime Meta-Programming কোডের আচরণ রানটাইমে পরিবর্তিত হয় (যেমন metaClass
, ExpandoMetaClass
, এবং methodMissing
)। Groovy তে মেটা-প্রোগ্রামিংয়ের মাধ্যমে আপনি কোডের কার্যকারিতা পরিবর্তন, নতুন মেথড বা প্রপার্টি ডাইনামিকভাবে যোগ করতে পারেন, যা উন্নত ও নমনীয় প্রোগ্রামিংয়ের জন্য উপকারী।
common.read_more